
public class Test {
    public static void main(String[] args) {
        // normal_thread();
        daemon_thread();
    }

    // 普通线程
    public static void normal_thread() {
        Thread t = new Thread(() -> {
            System.out.println("子线程正在跑!");
            try {
                Thread.sleep(2000);
            } catch (InterruptedException ignore) {
                System.out.println(ignore);
            }
            System.out.println("子线程结束！");
            // 不join主线程不会等，但 JVM 会等待所有非守护线程结束后才退出
            System.out.println("JVM 会等待所有非守护线程结束后才退出！");
        });
        t.start();
        // t.join(); // 主线程等子线程结束
        System.out.println("主线程执行完毕"); // TERMINATED
    }

    // 守护线程
    // 守护线程不能持有任何需要关闭的资源，例如打开文件等，因为虚拟机退出时，守护线程没有任何机会来关闭文件，这会导致数据丢失。
    public static void daemon_thread() {
        Thread t = new Thread(() -> {
            System.out.println("子线程正在跑!");
            try {
                Thread.sleep(2000);
            } catch (InterruptedException ignore) {
                System.out.println(ignore);
            }
            System.out.println("子线程结束！");
        });
        t.setDaemon(true); // 设置为守护线程
        t.start();
        System.out.println("主线程执行完毕");
        System.out.println("JVM 不等待守护线程结束！");
    }

}
// Java 的“守护线程”是 JVM 为了延迟进程退出而发明的概念；
// C++ 线程就是裸 OS 线程，进程死则所有线程一起被内核收尸，没有“JVM 守护”这一层逻辑。